{
  lib,
  stdenv,
  sage-src,
  env-locations,
  python,
  buildPythonPackage,
  m4,
  perl,
  pkg-config,
  sage-setup,
  setuptools,
  gd,
  iml,
  libpng,
  blas,
  boost,
  brial,
  cliquer,
  eclib,
  ecm,
  fflas-ffpack,
  flint,
  gap,
  givaro,
  glpk,
  gsl,
  lapack,
  lcalc,
  libbraiding,
  libhomfly,
  libmpc,
  linbox,
  lisp-compiler,
  lrcalc,
  m4ri,
  m4rie,
  mpfi,
  mpfr,
  ntl,
  pari,
  planarity,
  ppl,
  rankwidth,
  singular,
  sqlite,
  symmetrica,
  conway-polynomials,
  cvxopt,
  cypari2,
  cysignals,
  cython,
  fpylll,
  gmpy2,
  importlib-metadata,
  importlib-resources,
  ipykernel,
  ipython,
  ipywidgets,
  jupyter-client,
  jupyter-core,
  lrcalc-python,
  matplotlib,
  memory-allocator,
  meson-python,
  mpmath,
  networkx,
  numpy,
  pexpect,
  pillow,
  pip,
  pkgconfig,
  pplpy,
  primecountpy,
  ptyprocess,
  requests,
  rpy2,
  scipy,
  sphinx,
  sympy,
  typing-extensions,
}:

assert (!blas.isILP64) && (!lapack.isILP64);

# This is the core sage python package. Everything else is just wrappers gluing
# stuff together. It is not very useful on its own though, since it will not
# find many of its dependencies without `sage-env`, will not be tested without
# `sage-tests` and will not have html docs without `sagedoc`.

buildPythonPackage rec {
  version = src.version;
  pname = "sagelib";
  src = sage-src;
  pyproject = true;

  nativeBuildInputs = [
    iml
    lisp-compiler
    m4
    perl
    pip # needed to query installed packages
    pkg-config
    sage-setup
    setuptools
  ];

  pythonRelaxDeps = [
    "networkx"
  ];

  buildInputs = [
    gd
    iml
    libpng
  ];

  env = lib.optionalAttrs stdenv.cc.isClang {
    # code tries to assign a unsigned long to an int in an initialized list
    # leading to this error.
    # https://github.com/sagemath/sage/pull/39249
    NIX_CFLAGS_COMPILE = "-Wno-error=c++11-narrowing-const-reference";
  };

  propagatedBuildInputs = [
    # native dependencies (TODO: determine which ones need to be propagated)
    blas
    boost
    brial
    cliquer
    eclib
    ecm
    fflas-ffpack
    flint
    gap
    givaro
    glpk
    gsl
    lapack
    lcalc
    libbraiding
    libhomfly
    libmpc
    linbox
    lisp-compiler
    lrcalc
    m4ri
    m4rie
    mpfi
    mpfr
    ntl
    pari
    planarity
    ppl
    rankwidth
    singular
    sqlite
    symmetrica

    # from src/sage/setup.cfg and requirements.txt
    conway-polynomials
    cvxopt
    cypari2
    cysignals
    cython
    fpylll
    gmpy2
    importlib-metadata
    importlib-resources
    ipykernel
    ipython
    ipywidgets
    jupyter-client
    jupyter-core
    lrcalc-python
    matplotlib
    memory-allocator
    meson-python
    mpmath
    networkx
    numpy
    pexpect
    pillow
    pip
    pkgconfig
    pplpy
    primecountpy
    ptyprocess
    requests
    rpy2
    scipy
    sphinx
    sympy
    typing-extensions
  ];

  preBuild = ''
    export SAGE_ROOT="$PWD"
    export SAGE_LOCAL="$SAGE_ROOT"
    export SAGE_SHARE="$SAGE_LOCAL/share"

    # set locations of dependencies (needed for nbextensions like threejs)
    . ${env-locations}/sage-env-locations

    export JUPYTER_PATH="$SAGE_LOCAL/jupyter"
    export PATH="$SAGE_ROOT/build/bin:$SAGE_ROOT/src/bin:$PATH"

    export SAGE_NUM_THREADS="$NIX_BUILD_CORES"

    mkdir -p "$SAGE_SHARE/sage/ext/notebook-ipython"
    mkdir -p "var/lib/sage/installed"

    sed -i "/sage-conf/d" src/{setup.cfg,pyproject.toml,requirements.txt}

    cd build/pkgs/sagelib/src
  '';

  postInstall = ''
    rm -r "$out/${python.sitePackages}/sage/cython_debug"
  '';

  doCheck = false; # we will run tests in sage-tests.nix
}
